package com.itheima.exception;

import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器标识，如果controller出异常，就来找这个类，
 * 找这个类哪个方法呢? @ExceptionHandler注解的方法，默认方法的形参类型就是异常的类型
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 有多个异常类型时，按最小的优先级来处理异常，如果找不到子类异常处理的方法，则按上级父类异常，逐层处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result handlerException(Exception e) {// 方法形参中指定能够处理的异常类型
        log.error("发生未知异常！", e);
        //捕获到异常之后，响应一个标准的Result
        return Result.error("系统异常，请联系管理员!");
    }


    /**
     * 重复键值异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result handlerDuplicateKeyException(DuplicateKeyException e) {
        log.error("发生未知异常！", e);
        // 获取异常提示信息，
        // e.getCause的原因是：抛出异常是由数据库层面抛出的，经由spring框架捕获后包装成DuplicateKeyException.
        // 要获取真正的异常信息就得先获取根本的异常
        String message = e.getCause().getMessage();
        String[] split = message.split(" ");
        return Result.error(split[2] + "已存在了！");
    }


    /**
     * 业务异常处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result handlerBizException(BizException e) {
        return Result.error(e.getMessage());
    }
}
